package com.apobates.jforum2.troll.actionlog.biz;

import com.apobates.jforum2.troll.actionlog.entity.BoardActionCollection;
import com.apobates.jforum2.troll.regular.ForumActionEnum;
import com.apobates.jforum2.troll.utils.persistence.Page;
import com.apobates.jforum2.troll.utils.persistence.Pageable;
import java.util.Optional;
import java.util.stream.Stream;

/**
 * 版块动作集合的业务层接口
 *
 * @author xiaofanku
 * @since 20200514
 */
public interface BoardActionCollectionService {
    //
    void create(BoardActionCollection entity);
    /**
     * 指定会员的版块动作
     *
     * @param memberId 会员ID
     * @param pageable 分页请求参数
     * @return
     */
    Page<BoardActionCollection> getByMember(long memberId, Pageable pageable);
    
    /**
     * 查看指定版块发生的动作
     *
     * @param boardId 版块ID
     * @param pageable 分页请求参数
     * @return
     */
    Page<BoardActionCollection> getByBoard(long boardId, Pageable pageable);
    /**
     * 查看指定版块发生的动作
     * 
     * @param boardId 版块ID
     * @param action 版块动作
     * @param pageable 分页请求参数
     * @return 
     */
    Page<BoardActionCollection> getByBoard(long boardId, ForumActionEnum action, Pageable pageable);
    
    /**
     * 所有的版块操作动作
     *
     * @param pageable 分页请求参数
     * @return
     */
    Page<BoardActionCollection> getAll(Pageable pageable);
    
    /**
     * 指定会员最近的版块动作
     *
     * @param memberId 会员ID
     * @param size 显示的数量
     * @return
     */
    Stream<BoardActionCollection> getRecentByMember(long memberId, int size);
    
    /**
     * 查看会员收藏/星标的版块
     *
     * @param memberId 会员ID
     * @param size 显示的数量
     * @return
     */
    Stream<BoardActionCollection> getMemberFavoriteBoard(long memberId, int size);
    //从版块操作中脱离出来
    Optional<Boolean> isFavoritedBoard(long boardId, long memberId);
    long countMemberBoardAction(long memberId, long boardId, ForumActionEnum action);
    //从版块收藏/取消收藏中脱离出来
    boolean remove(long boardId, long memberId, ForumActionEnum action);
    /**
     * 统计指定会员收藏/星标的版块数量
     * 
     * @param memberId 会员ID
     * @return 
     */
    long countFavoritesForMember(long memberId);
    /**
     * 查看指定会员收藏/星标的版块操作记录
     * 
     * @param memberId 会员ID
     * @param pageable 分页请求参数
     * @return 
     */
    Page<BoardActionCollection> getFavoritesForMember(long memberId, Pageable pageable);
}